package LinkedList;
public class SingleLikedLIstTest {
    public static void main(String[] args){
        Child child1 = new Child(1,"小明","男");
        Child child2 = new Child(2,"小红","女");
        Child child3 = new Child(3,"小张","男");
        Child child4 = new Child(4,"小雅","女");
        Child child5 = new Child(5,"小蓝","女");
        Child child6 = new Child(3,"小菲","女");
        SingleLinkedList list = new SingleLinkedList();
        list.add2(child3);
        list.add2(child5);
        list.add2(child2);
        list.add2(child1);
        list.add2(child4);
        list.show();
        System.out.println("------------删除后--------------");
        list.delete(3);
        list.show();

    }
}
class Child{
    int no;
    String name;
    String sex;
    Child next; // 指针，指向下一个节点
    // 构造函数
    public Child(int no, String name, String sex){
        this.no = no;
        this.name = name;
        this.sex = sex;
    }
    // 为了显示方便，我们需要重写toString方法
    @Override
    public String toString(){
        return "child [no = " + no + ", name = " + name + ", sex = " + sex + "]";
    }
}
class SingleLinkedList{
    // 先初始化一个头节点
    Child head = new Child(0, "", ""); // 头节点不能动，也不存放任何数据

    // 向单链表中添加节点
    public void add(Child child){
        Child p = head; // p 为辅助指针，帮助我们遍历链表
        while(true){
            if(p.next == null){
                break;
            }
            p = p.next;
        }
        p.next = child;
    }
    // 新的加入方法：按顺序加入
    public void add2(Child child){
        Child p = head;
        boolean flag = false; // 标志待加入的节点是否已存在，默认为false
        while(true){
            if(p.next == null){
                break;
            }
            if(p.next.no > child.no){ // 找到了
                break;
            }
            if(p.next.no == child.no){
                flag = true;
                break;
            }
            p = p.next;
        }
        if(flag) {
            System.out.println("待插入的节点已经存在，不能重复添加");
        }else{
            child.next = p.next;
            p.next = child;
        }
    }
    // 根据编号修改节点
    public void update(Child newChild){
        Child p = head.next;
        boolean flag = false; // 表示待修改的节点是否找到
        // 先判断链表是否为空
        if(head.next == null){
            System.out.println("链表为空~");
        }
        while (true) {
            if (p == null) {
                break;
            } else if (p.no == newChild.no) {
                flag = true;
                break;
            }
            p = p.next;
        }
        if (flag) {
            p.name = newChild.name;
            p.sex = newChild.sex;
        }else{
            System.out.println("待修改的节点没有找到");
        }
    }

    // 根据编号删除节点
    public void delete(int no){
        Child p = head.next;
        boolean flag = false; // 标志是否找到待删除的节点
        if (head.next == null) {
            System.out.println("链表为空~");
            return;
        }
        while (true) {
            if (p == null) {
                break;
            }
            if (p.next.no == no) {
                flag = true;
                break;
            }
            p = p.next;
        }
        if (flag) {
            p.next = p.next.next;
        }else{
            System.out.println("待删除的节点没有找到");
        }
    }

    // 显示链表中所有的节点
    public void show(){
        Child p = head.next;
        // 先判断链表是否为空
        if(head.next == null){
            System.out.println("对不起，链表为空，没有数据显示");
            return;
        }
        while(true){
            if(p == null){
                break;
            }
            System.out.println(p);
            p = p.next;
        }

    }
    // 单链表的滞空操作
    public void clear(){
        head.next = null;
    }




}